package com.apikey.auth.provider;

/**
 * API Key用户信息提供者接口
 * 用于获取和验证用户信息，支持扩展自定义用户系统
 *
 * @author API Key Framework
 * @version 1.0
 */
public interface ApiKeyUserProvider {

    /**
     * 根据用户ID获取用户信息
     *
     * @param userId 用户ID
     * @return 用户信息，如果用户不存在返回null
     */
    UserInfo getUserById(String userId);

    /**
     * 根据用户名获取用户信息
     *
     * @param username 用户名
     * @return 用户信息，如果用户不存在返回null
     */
    UserInfo getUserByUsername(String username);

    /**
     * 验证用户是否存在且有效
     *
     * @param userId 用户ID
     * @return 用户是否有效
     */
    boolean isValidUser(String userId);

    /**
     * 验证用户是否有权限创建API Key
     *
     * @param userId 用户ID
     * @return 是否有权限
     */
    boolean canCreateApiKey(String userId);

    /**
     * 验证用户是否有权限管理指定的API Key
     *
     * @param userId      用户ID
     * @param apiKeyValue API Key值
     * @return 是否有权限
     */
    boolean canManageApiKey(String userId, String apiKeyValue);

    /**
     * 获取用户的API Key数量限制
     *
     * @param userId 用户ID
     * @return API Key数量限制，-1表示无限制
     */
    int getApiKeyLimit(String userId);

    /**
     * 获取用户的默认权限列表
     *
     * @param userId 用户ID
     * @return 默认权限列表，以逗号分隔
     */
    String getDefaultPermissions(String userId);

    /**
     * 用户信息数据传输对象
     */
    class UserInfo {
        private String userId;
        private String username;
        private String email;
        private String displayName;
        private boolean active;
        private String role;

        /**
         * 默认构造函数
         */
        public UserInfo() {
        }

        /**
         * 构造函数
         *
         * @param userId      用户ID
         * @param username    用户名
         * @param email       邮箱
         * @param displayName 显示名称
         * @param active      是否激活
         * @param role        角色
         */
        public UserInfo(String userId, String username, String email, String displayName, boolean active, String role) {
            this.userId = userId;
            this.username = username;
            this.email = email;
            this.displayName = displayName;
            this.active = active;
            this.role = role;
        }

        // Getter和Setter方法

        public String getUserId() {
            return userId;
        }

        public void setUserId(String userId) {
            this.userId = userId;
        }

        public String getUsername() {
            return username;
        }

        public void setUsername(String username) {
            this.username = username;
        }

        public String getEmail() {
            return email;
        }

        public void setEmail(String email) {
            this.email = email;
        }

        public String getDisplayName() {
            return displayName;
        }

        public void setDisplayName(String displayName) {
            this.displayName = displayName;
        }

        public boolean isActive() {
            return active;
        }

        public void setActive(boolean active) {
            this.active = active;
        }

        public String getRole() {
            return role;
        }

        public void setRole(String role) {
            this.role = role;
        }

        @Override
        public String toString() {
            return "UserInfo{" +
                    "userId='" + userId + '\'' +
                    ", username='" + username + '\'' +
                    ", email='" + email + '\'' +
                    ", displayName='" + displayName + '\'' +
                    ", active=" + active +
                    ", role='" + role + '\'' +
                    '}';
        }
    }
}